package cn.dengta.webapp.im.entity;

import java.util.Date;
import javax.annotation.Nullable;

import cn.dengta.webapp.base.entity.BaseEntity;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
import lombok.experimental.Accessors;
import me.codeplayer.util.*;

/**
 * 云信回调消息记录表
 *
 * @author william.wang
 * @since 2022-03-15
 */
@Setter
@Getter
@Accessors(chain = true)
@TableName("im_msg_log")
public class MsgLog extends BaseEntity {

	/**
	 * 消息回调事件类型：1=单聊消息回调；2=群聊消息回调
	 * https://doc.yunxin.163.com/docs/TM5MzM5Njk/jI3ODc2ODE?platformId=60353#第三方回调事件类型
	 */
	private Integer eventType;

	/**
	 * 会话具体类型：
	 * <p>
	 * PERSON（点对点会话内消息）
	 * TEAM（群聊会话内消息）
	 * SUPER_TEAM（超大群聊会话内消息）
	 * CUSTOM_PERSON（点对点自定义系统通知及内置好友系统通知）
	 * CUSTOM_TEAM（群聊自定义系统通知及内置群聊系统通知）
	 * 字符串类型
	 */
	private String convType;

	/**
	 * 若convType为 PERSON 或 CUSTOM_PERSON，则to为消息接收者的用户账号，字符串类型；
	 * 若convType为 TEAM 或 SUPER_TEAM 或 CUSTOM_TEAM，则to为tid，即群id，可转为Long型数据
	 */
	private String toAccount;

	/** 消息发送者的用户账号，字符串类型 */
	private String fromAccount;
	/** 发送信息的用户ID */
	private Long userId;
	/** 接收信息的用户ID（如果是群组消息，可能为 null） */
	@Nullable
	private Long toUserId;
	/** 群组ID（仅群组消息时有值 null） */
	@Nullable
	private Long groupId;
	/** 发送客户端类型： AOS、IOS、PC、WINPHONE、WEB、REST，字符串类型 */
	private String fromClientType;

	/** 发送设备id，字符串类型 */
	private String fromDeviceId;

	/** 发送方昵称，字符串类型 */
	private String fromNick;

	/**
	 * convType为PERSON、TEAM、SUPER_TEAM时对应的消息类型：
	 * TEXT //文本消息
	 * PICTURE //图片消息
	 * AUDIO //语音消息
	 * VIDEO //视频消息
	 * LOCATION //地理位置消息
	 * NOTIFICATION //群通知消息，如群资料更新通知、群解散通知等。
	 * FILE //文件消息
	 * TIPS //提示消息
	 * CUSTOM //自定义消息
	 * NRTC_NETCALL // 音视频2.0话单消息抄送
	 * <p>
	 * convType为CUSTOM_PERSON对应的通知消息类型：
	 * FRIEND_ADD //对方 请求/已经 添加为好友
	 * FRIEND_DELETE //被对方删除好友
	 * CUSTOM_P2P_MSG //点对点自定义系统通知
	 * <p>
	 * convType为CUSTOM_TEAM对应的通知消息类型（请注意与NOTIFICATION区分）：
	 * TEAM_APPLY //申请入群
	 * TEAM_APPLY_REJECT //拒绝入群申请
	 * TEAM_INVITE //邀请进群
	 * TEAM_INVITE_REJECT //拒绝邀请
	 * CUSTOM_TEAM_MSG //群组自定义系统通知
	 * SUPERTEAM_APPLY //超大群申请入群
	 * SUPERTEAM_APPLY_REJECT //超大群拒绝入群申请
	 * SUPERTEAM_INVITE //超大群邀请进群
	 * SUPERTEAM_INVITE_REJECT //超大群拒绝进群邀请
	 * CUSTOM_SUPERTEAM_MSG //超大群组自定义系统通知
	 */
	private String msgType;

	/** 消息内容，字符串类型。针对聊天室消息而言，无此字段。内容转由attach承载。 */
	private String body;

	/** 附加消息，字符串类型。注意：音视频通话 2.0 消息抄送中，attach字段包含通话类型、呼叫状态等通话详情。详细信息请参考话单消息结构。 */
	private String attach;

	/** 客户端生成的消息id，仅在convType为PERSON或TEAM或SUPER_TEAM含此字段，字符串类型 */
	private String msgidClient;

	/** 服务端生成的消息id，可转为Long型数据 */
	private String msgidServer;

	/** 重发标记：0不是重发, 1是重发。仅在convType为PERSON或TEAM或SUPER_TEAM时含此字段，可转为Integer类型数据 */
	private String resendFlag;

	/**
	 * 自定义系统通知消息是否存离线:0：不存，1：存。
	 * 仅在convType为CUSTOM_PERSON或CUSTOM_TEAM时含此字段，可转为Integer类型数据
	 */
	private String customSafeFlag;

	/** 自定义系统通知消息推送文本。仅在convType为CUSTOM_PERSON或CUSTOM_TEAM时含此字段，字符串类型 */
	private String customApnsText;

	/** 消息扩展字段 */
	private String ext;

	/** 消息发送方的客户端IP地址(仅SDK发送的消息才有该字段) */
	private String ip;

	/** 是否敏感 */
	private Integer sensitiveStatus;
	/** 是否撤回 */
	private Integer withdrawStatus;

	/** 消息发送时间 */
	private Date sendTime;
	/** 添加时间 */
	protected Date addTime;

	@Getter(AccessLevel.NONE)
	@Setter(AccessLevel.NONE)
	transient JSONObject parsedAttach;

	public JSONObject parsedAttach() {
		if (parsedAttach == null) {
			parsedAttach = JSONUtil.parseObject(attach);
		}
		return parsedAttach;
	}

	public String getImage() {
		if (StringUtil.notEmpty(attach)) {
			if ("PICTURE".equals(msgType)) {
				return parsedAttach().getString("url");
			} else if ("CUSTOM".equals(msgType)) {
				JSONObject attach = parsedAttach();
				if (attach != null) {
					Integer type = attach.getInteger("type");
					if (type != null) {
						switch (type) { // CustomMsgType
							case 812: // 一次性图片 {"msg":{"picUrl":"https://flala-uat.oss-ap-southeast-1.aliyuncs.com/t1552/chatPhoto/2022-09/8d1934f20006386645d30871c0de3d37.jpg"},"type":812}
								return X.map(attach.getJSONObject("msg"), o -> o.getString("picUrl"));
							case 1301: // 直播间分享 {"msg":{"avatar":"https://flala-uat.oss-ap-southeast-1.aliyuncs.com/t33941/avatar/2022-09/4ffdb7c59e6417490f1eeed69561af58.jpg","channelName":"R-114l-1235","nickname":"testwe","userId":"t33941"},"type":1301}
								return X.map(attach.getJSONObject("msg"), o -> o.getString("avatar"));
							case 1400: // 游戏分享 {"msg":{"icon":"https://oss.flala6.com/flala/picture/logo/bird.png","link":"https://test-game.flala6.com/webBird/","text":"我在玩【Flappy Bird】超好玩的小游戏，一起来玩吧！"},"type":1400}
								return X.map(attach.getJSONObject("msg"), o -> o.getString("icon"));
						}
					}
				}
			}
		}
		return null;
	}

	public String getAudio() {
		return "AUDIO".equals(msgType) && StringUtil.notEmpty(attach) ? parsedAttach().getString("url") : null;
	}

}
